# BabyOS Netif功能模块设计 ## 第二版 目前master分支的代码,b_srv_tcpip 基于 b_module_netif 的接口实现了ntp同步时间。代码结构上存在问题,影响后续的扩展:b_mod_netif里的代码过度依赖lwip,如果后续TCP/UDP的传输不需要LWIP,换做uip或者WIFI模组,那么b_mod_netif里面的代码用不了,或者改动非常大。 那么重写netif这部分,达到两个目的: ① 不过度依赖任何协议栈,定义相对标准的接口,用lwip实现或者用uIP实现或者at指令驱动WIFI模组实现都可以,实现方式之间互不影响,对上层的应用也不影响。 ② 能基于虚拟机调试网络功能,不依赖具体硬件方便开发者扩展b_srv_tcpip的内容。 ![net_2_level ](../_static/net_2_level.jpg) 将原先的1个文件b_mod_netif进行拆分: ![net_2_level ](../_static/net_2_file.jpg) 重新划分后,重点是在传输层的接口定义和实现。 接口定义(见 bos/modules/inc/b_mod_netif/b_mod_trans.h): ```C int bSocket(bTransType_t type, pbTransCb_t cb, void *user_data); int bConnect(int sockfd, char *remote, uint16_t port); int bBind(int sockfd, uint16_t port); int bListen(int sockfd, int backlog); int bRecv(int sockfd, uint8_t *pbuf, uint16_t buf_len, uint16_t *rlen); int bSend(int sockfd, uint8_t *pbuf, uint16_t buf_len, uint16_t *wlen); int bShutdown(int sockfd); uint8_t bSockIsReadable(int sockfd); uint8_t bSockIsWriteable(int sockfd); int bDnsParse(char *remote, pbTransDnsCb_t cb, void *user_data); int bPing(char *remote, uint32_t timeout_ms, pbTransPingCb_t cb, void *user_data); ``` 当要使用LWIP时,则将b_mod_lwip加入工程。 当在虚拟机上运行时,则将b_mod_socket加入工程。 这样下面接口统一,具体的实现发生变化也不影响b_srv_tcpip的代码。 目前代码合并到了dev分支,需要各位开发者一起验一下,测试一段时间后再合入master。 基于stm32:例程仓库stm32f107_hal分支 虚拟机上运行:主仓库dev分支。BabyOS/test/netif/ ![net_2_level ](../_static/net_2_test.png) ## 第一版 Client和Server核心是连接,Client只包含1个连接,而Server可以存在多个连接。因此存在三个名词:客户端、服务端、网络连接。分别对应如下数据结构: ![netif_struct](../_static/netif_struct.jpg) 客户端与服务端基于网络连接,网络连接基于lwip 客户端代码运行流程: ![netif_client](../_static/netif_client.jpg) 服务端代码运行流程: ![netif_server](../_static/netif_server.jpg) 例子:https://gitee.com/notrynohigh/BabyOS_Example/tree/stm32f107_hal/ 体验BabyOS提供的便利,快速实现TCP客户和TCP服务